home *** CD-ROM | disk | FTP | other *** search
- enum File_state { UNOPENED, BUFFER_ALLOCATED, FILE_OPEN,
- RECORD_READ};
- char * File_state_strings[] = {"Unopened", "Buffer allocation",
- "File open", "File reading"};
-
- typedef struct
- {
- enum File_state state; // Current state of file
- int file_id; // Id from open
- char *buffer; // Buffer for read
- } File;
-
- int File_initialize(File * file, char *filename, char *purpose);
- void File_terminate(File * file);
-
- #define SUCCESS 1
- #define FAILURE 0
-
- main()
- {
- File file;
- int return_code;
- if (File_initialize(&file, "filename", "purpose") == SUCCESS)
- {
- return_code = 0;
- /* Do whatever required */
- }
- else
- return_code = 1;
- File_terminate(&file);
- exit(return_code);
- }
-
- int File_initialize(File * file, char *filename, char *purpose)
- {
- int read_count;
- int return_code = FAILURE;
- file->state = UNOPENED;
- if (Buffer_initialize(&file->buffer, BUFSIZ, "file buffer")
- == SUCCESS)
- file->state = BUFFER_ALLOCATED;
- if (file->state == BUFFER_ALLOCATED)
- {
- file->file_id = open(filename, O_RDONLY);
- if (file->file_id >= 0)
-
- file->state = FILE_OPEN;
- }
- if (file->state == FILE_OPEN)
- {
- read_count = read(file->file_id, file->buffer, BUFSIZ);
- if (read_count > 0)
- {
- file->state = RECORD_READ;
- return_code = SUCCESS;
- }
- }
- if (return_code != SUCCESS)
- fprintf(stderr, "Filename %s purpose %s error at %s",
- filename, purpose, File_state_strings[file->state]);
- return return_code;
- }
-
- void File_terminate(File * file)
- {
- /*** Maintenance note - fall through required ***/
- switch(file->state)
- {
- case RECORD_READ:
- case FILE_OPEN:
- close(file->file_id);
- case BUFFER_ALLOCATED:
- Buffer_terminate(&file->buffer);
- case UNOPENED:
- break;
- default:
- fprintf("Error in File_terminate -- illegal state");
- }
- return;
- }
-
-
-